package cn.com.aiouyi.plugin;

import cn.com.aiouyi.common.Message;
import cn.com.aiouyi.entity.PluginConfig;
import cn.com.aiouyi.service.PluginConfigService;
import org.apache.commons.lang3.builder.CompareToBuilder;
import org.apache.commons.lang3.builder.EqualsBuilder;
import org.apache.commons.lang3.builder.HashCodeBuilder;
import org.springframework.stereotype.Component;

import javax.annotation.Resource;
import java.io.File;
import java.io.InputStream;

/**
 * Plugin - 存储
 */
public abstract class StoragePlugin implements Comparable<StoragePlugin> {

    @Resource(name = "pluginConfigServiceImpl")
    private PluginConfigService pluginConfigService;

    /**
     * 文件类型
     */
    public enum FileType {
        /**
         * 图片
         */
        image,
        /**
         * 文本文件
         */
        text,
        /**
         * 视频
         */
        video,
        /**
         * 其他
         */
        other
    }


    /**
     * 获取ID
     *
     * @return ID
     */
    public String getId() {
        return getClass().getAnnotation(Component.class).value();
    }

    /**
     * 获取名称
     *
     * @return 名称
     */
    public abstract String getName();

    /**
     * 获取版本
     *
     * @return 版本
     */
    public abstract String getVersion();

    /**
     * 获取作者
     *
     * @return 作者
     */
    public abstract String getAuthor();

    /**
     * 获取网址
     *
     * @return 网址
     */
    public abstract String getSiteUrl();

    /**
     * 获取安装URL
     *
     * @return 安装URL
     */
    public abstract String getInstallUrl();

    /**
     * 获取卸载URL
     *
     * @return 卸载URL
     */
    public abstract String getUninstallUrl();

    /**
     * 获取设置URL
     *
     * @return 设置URL
     */
    public abstract String getSettingUrl();

    /**
     * 获取是否已安装
     *
     * @return 是否已安装
     */
    public boolean getIsInstalled() {
        return pluginConfigService.pluginIdExists(getId());
    }

    /**
     * 获取插件配置
     *
     * @return 插件配置
     */
    public PluginConfig getPluginConfig() {
        return pluginConfigService.findByPluginId(getId());
    }

    /**
     * 获取是否已启用
     *
     * @return 是否已启用
     */
    public boolean getIsEnabled() {
        PluginConfig pluginConfig = getPluginConfig();
        return pluginConfig != null ? pluginConfig.getIsEnabled() : false;
    }

    /**
     * 获取排序
     *
     * @return 排序
     */
    public Integer getSeq() {
        PluginConfig pluginConfig = getPluginConfig();
        return pluginConfig != null ? pluginConfig.getSeq() : null;
    }

    /**
     * 文件上传
     *
     * @param path        上传路径
     * @param file        上传文件
     * @param fileType 文件类型
     */
    public abstract Message upload(String path, File file, FileType fileType);

    /**
     * 文件上传
     * @param originName 原始文件名
     * @param path        上传路径
     * @param is          上传的文件流
     * @param fileType 文件类型
     */
    public abstract Message upload(String path, String originName, InputStream is, FileType fileType);

    /**
     * 获取访问URL
     *
     * @param path 上传路径
     * @return 访问URL
     */
    public abstract String getUrl(String path);

    /**
     * 判断文件是否符合上传要求
     *
     * @param filename 文件名
     * @param fileType 文件类型
     * @return 访问URL
     */
    public abstract Boolean fileSuffixValidation(String filename, FileType fileType);

    /**
     * 重写equals方法
     *
     * @param obj 对象
     * @return 是否相等
     */
    @Override
    public boolean equals(Object obj) {
        if (obj == null) {
            return false;
        }
        if (getClass() != obj.getClass()) {
            return false;
        }
        if (this == obj) {
            return true;
        }
        StoragePlugin other = (StoragePlugin) obj;
        return new EqualsBuilder().append(getId(), other.getId()).isEquals();
    }

    /**
     * 重写hashCode方法
     *
     * @return HashCode
     */
    @Override
    public int hashCode() {
        return new HashCodeBuilder(17, 37).append(getId()).toHashCode();
    }

    /**
     * 实现compareTo方法
     *
     * @param storagePlugin 存储插件
     * @return 比较结果
     */
    public int compareTo(StoragePlugin storagePlugin) {
        if (storagePlugin == null) {
            return 1;
        }
        return new CompareToBuilder().append(getSeq(), storagePlugin.getSeq()).append(getId(), storagePlugin.getId()).toComparison();
    }

}